# -*- coding: utf-8 -*-
"""
股票交易分析系统主程序
"""

import time
import signal
import sys
from utils.logger import setup_logger
from services.east_money_service import EastMoneyAPIService
import logging


class TradeAnalysisSystem:
    """股票交易分析系统主类"""
    
    def __init__(self):
        # 初始化日志
        setup_logger()
        self.logger = logging.getLogger(__name__)
        
        # 初始化服务
        self.api_service = EastMoneyAPIService()
        self.trade_service = None
        self.scheduler_service = None
        
        # 注册信号处理器
        signal.signal(signal.SIGINT, self._signal_handler)
        signal.signal(signal.SIGTERM, self._signal_handler)
        
        self.logger.info("股票交易分析系统初始化完成")
    
    def _signal_handler(self, signum, frame):
        """信号处理器"""
        self.logger.info(f"收到信号 {signum}，准备退出...")
        self.stop()
        sys.exit(0)
    
    def test_api_connection(self):
        """测试API连接"""
        self.logger.info("开始测试API连接...")
        
        if self.api_service.test_connection():
            self.logger.info("✅ API连接测试成功")
            return True
        else:
            self.logger.error("❌ API连接测试失败")
            return False
    
    def start(self):
        """启动系统"""
        try:
            self.logger.info("🚀 启动股票交易分析系统")
            
            # 测试API连接
            if not self.test_api_connection():
                self.logger.error("API连接失败，系统无法启动")
                return False
            
            # 延迟导入，避免循环依赖
            from services.trade_service import TradeService
            from services.scheduler_service import SchedulerService
            
            # 初始化交易服务
            self.trade_service = TradeService()
            
            # 初始化调度服务
            self.scheduler_service = SchedulerService(self.trade_service)
            
            # 启动调度器
            self.scheduler_service.start()
            
            self.logger.info("✅ 系统启动成功")
            
            # 保持主线程运行
            try:
                while True:
                    time.sleep(1)
            except KeyboardInterrupt:
                self.logger.info("收到中断信号，准备停止系统...")
                self.stop()
                
        except Exception as e:
            self.logger.error(f"系统启动失败: {e}")
            return False
    
    def stop(self):
        """停止系统"""
        try:
            self.logger.info("🛑 停止股票交易分析系统")
            
            if self.scheduler_service:
                self.scheduler_service.stop()
                
            self.logger.info("✅ 系统已停止")
            
        except Exception as e:
            self.logger.error(f"系统停止失败: {e}")
    
    def manual_buy_task(self, target_date=None):
        """手动执行买入任务"""
        try:
            if target_date:
                self.logger.info(f"🔧 手动执行买入任务，指定日期: {target_date}")
            else:
                self.logger.info("🔧 手动执行买入任务")
            
            # 延迟导入
            from services.trade_service import TradeService
            
            trade_service = TradeService()
            trade_service.manual_buy_task(target_date)
            
            self.logger.info("✅ 手动买入任务完成")
            
        except Exception as e:
            self.logger.error(f"手动买入任务失败: {e}")
    
    def manual_sell_task(self, target_date=None):
        """手动执行收盘统计任务"""
        try:
            if target_date:
                self.logger.info(f"🔧 手动执行收盘统计任务，指定日期: {target_date}")
            else:
                self.logger.info("🔧 手动执行收盘统计任务")
            
            # 延迟导入
            from services.trade_service import TradeService
            
            trade_service = TradeService()
            trade_service.manual_sell_task(target_date)
            
            self.logger.info("✅ 手动收盘统计任务完成")
            
        except Exception as e:
            self.logger.error(f"手动收盘统计任务失败: {e}")
    
    def show_trading_summary(self):
        """显示交易汇总"""
        try:
            self.logger.info("📊 获取交易汇总信息")
            
            # 延迟导入
            from services.trade_service import TradeService
            
            trade_service = TradeService()
            summary = trade_service.get_trading_summary()
            
            print("\n" + "="*50)
            print("📊 交易汇总统计")
            print("="*50)
            print(f"总股票数量: {summary['total_stocks']}")
            print(f"已完成股票: {summary['completed_stocks']}")
            print(f"活跃股票数: {summary['active_stocks']}")
            print(f"平均收益率: {summary['avg_return']:.2f}%")
            print(f"最大收益率: {summary['max_return']:.2f}%")
            print(f"最小收益率: {summary['min_return']:.2f}%")
            print(f"更新时间: {summary['update_time']}")
            print("="*50)
            
        except Exception as e:
            self.logger.error(f"获取交易汇总失败: {e}")


def main():
    """主函数"""
    import argparse
    
    parser = argparse.ArgumentParser(description='股票交易分析系统')
    parser.add_argument('--test-api', action='store_true', help='测试API连接')
    parser.add_argument('--manual', choices=['buy', 'sell'], help='手动执行任务')
    parser.add_argument('--date', type=str, help='指定日期 (YYYY-MM-DD格式，仅用于手动任务)')
    parser.add_argument('--summary', action='store_true', help='显示交易汇总')
    
    args = parser.parse_args()
    
    # 创建系统实例
    system = TradeAnalysisSystem()
    
    if args.test_api:
        # 仅测试API连接
        system.test_api_connection()
    elif args.manual == 'buy':
        # 手动执行买入任务
        target_date = None
        if args.date:
            try:
                from datetime import datetime
                target_date = datetime.strptime(args.date, '%Y-%m-%d').date()
            except ValueError:
                print(f"❌ 日期格式错误: {args.date}，请使用 YYYY-MM-DD 格式")
                sys.exit(1)
        system.manual_buy_task(target_date)
    elif args.manual == 'sell':
        # 手动执行收盘统计任务
        target_date = None
        if args.date:
            try:
                from datetime import datetime
                target_date = datetime.strptime(args.date, '%Y-%m-%d').date()
            except ValueError:
                print(f"❌ 日期格式错误: {args.date}，请使用 YYYY-MM-DD 格式")
                sys.exit(1)
        system.manual_sell_task(target_date)
    elif args.summary:
        # 显示交易汇总
        system.show_trading_summary()
    else:
        # 正常启动系统
        system.start()


if __name__ == "__main__":
    main()